perm filename CLIP2D.FAI[1,BGB] blob
sn#001263 filedate 1972-10-22 generic text, type T, neo UTF8
00100 COMMENT / SUTHERLAND & SPROUL HARDWARE CLIPPING ALGORITHM - ARGS X1,Y1,X2,Y2 EXTERN -
00200 - RETURNS VALUES IN X1,Y1,X2,Y2 & FLAG - FLAG TRUE IF LINE SEG SHOWING/
00300 TITLE CLIP2D
00400 INTERNAL CLIP2D;
00500 INTERNAL X1,Y1,X2,Y2,XL,YL,XH,YH,FLAG;
00550 X1: 0↔Y1: 0↔X2: 0↔Y2: 0↔XL: 0↔YL: 0↔XH: 0↔YH: 0↔FLAG: 0;
00600 ; ACCUMULATORS
00700 XI←1; INNER OR FIRST
00800 YI←2
00900 XO←3; OUTER OR SECOND
01000 YO←4
01100 MX←5; MIDPOINTS
01200 MY←6
01300 NX←7
01400 NY←8
01500 SKIPPER←9
01600 P←17
01700
01800 DEFINE INSIDE(X,Y,L); FALLS THRU IF TRUE
01900 { CAMGE X,XL ↔ JRST L
02000 CAMLE X,XH ↔ JRST L
02100 CAMGE Y,YL ↔ JRST L
02200 CAMLE Y,YH ↔ JRST L}
02300
02400 DEFINE OUTEASY(X1,Y1,X2,Y2,L); JUMPS IF TRUE
02500 { CAMGE X1,XH ↔ JRST .+3 ↔ CAML X2,XH ↔ JRST L
02600 CAMGE Y1,YH ↔ JRST .+3 ↔ CAML Y2,YH ↔ JRST L
02700 CAMLE X1,XL ↔ JRST .+3 ↔ CAMG X2,XL ↔ JRST L
02800 CAMLE Y1,YL ↔ JRST .+3 ↔ CAMG Y2,YL ↔ JRST L}
02900
03000 CLIP2D: SETOM FLAG; ASSUME DISPLAY UNTIL FOUND OTHERWISE
03100 MOVE XI,X1; ASSUME POINT1 INSIDE UNTIL FOUND OTHERWISE
03200 MOVE YI,Y1
03300 MOVE XO,X2; ASSUME POINT2 OUTSIDE UNTIL FOUND OTHERWISE
03400 MOVE YO,Y2
03500 OUTEASY(1,2,3,4,NOSHOW); BOTH POINTS TO ONE SIDE OF THE WINDOW
03600 INSIDE(1,2,P1OUT); JUMP IF POINT1 IS OUTSIDE
03700 INSIDE(3,4,P2OUT); JUMP IF POINT2 IS OUTSIDE
03800 POPJ P,; BOTH POINTS INSIDE OF WINDOW
03900
04000 NOSHOW: SETZM FLAG; NO DISPLAY
04100 POPJ P,
04200
04300 P1OUT: INSIDE(3,4,BOTHOUT); JUMP IF BOTH ARE OUTSIDE
04400 SETOM SKIPPER; DISABLE POINT2 CONVERGENCE, IT'S NOT NEEDED.
04500 EXCH XO,XI; POINT 2 INSIDE, POINT 1 OUTSIDE
04600 EXCH YO,YI
00100 DEFINE MIDPOINT {
00200 MOVE MX,XO; COMPUTE MIDPOINT
00300 MOVE MY,YO
00400 ADD MX,XI
00500 ADD MY,YI
00600 ASH MX,-1
00700 ASH MY,-1}
00800
00900 DEFINE CONVERGE {
01000 MOVE XO; TEST FOR CONVERGENCE
01100 SUB XI
01200 MOVM
01300 SOJLE [ MOVE YO
01400 SUB YI
01500 MOVM
01600 SOJLE .+25
01700 JRST .+1]
01800 MIDPOINT
01900 CAMGE MX,XL ↔ JRST .+12; IS MIDPOINT INSIDE ?
02000 CAMLE MX,XH ↔ JRST .+10
02100 CAMGE MY,YL ↔ JRST .+6
02200 CAMLE MY,YH ↔ JRST .+4
02300 MOVE XI,MX; NEW MIDPOINT INSIDE
02400 MOVE YI,MY
02500 JRST .-24
02600 MOVE XO,MX; NEW MIDPOINT OUTSIDE
02700 MOVE YO,MY
02800 JRST .-27}
02900
03000
03100 P1CONV: CONVERGE
03200 MOVEM XI,X1
03300 MOVEM YI,Y1
03400 SKIPE SKIPPER
03500 POPJ P,
03600
03700 MOVE XO,X2; SETUP TO FIND P2 ON A BOTH OUT CASE
03800 MOVE YO,Y2
03900 MOVE XI,NX
04000 MOVE YI,NY
04100
04200 P2OUT: CONVERGE
04300 MOVEM XI,X2
04400 MOVEM YI,Y2
04500 POPJ P,
00100 MIDOUT: OUTEASY(1,2,MX,MY,MIDP1); MIDPOINT OUTSIDE, SEE IF POINT1'S HALF IS EASY OUT.
00200 MOVE 3,MX; MIDPOINT REPLACES POINT2
00300 MOVE 4,MY
00400
00500 BOTHOUT: MIDPOINT
00600 INSIDE(MX,MY,MIDOUT);
00700 SETZM SKIPPER; MIDPOINT INSIDE
00800 MOVEM XO,X2; SAVE POINT2
00900 MOVEM YO,Y2
01000 MOVE XO,XI; SETUP POINT1 OUTSIDE
01100 MOVE YO,YI
01200 MOVEM MX,NX; COPY MIDPOINT
01300 MOVEM MY,NY;
01400 MOVE XI,MX; MIDPOINT INSIDE
01500 MOVE YI,MY
01600 JRST P1CONV; CONVERGE ON EACH END
01700
01800 MIDP1: MOVE 1,MX; MIDPOINT REPLACES POINT1
01900 MOVE 2,MY
02000 OUTEASY(MX,MY,3,4,NOSHOW); SEE IF POINT2'S HALF IS EASY OUT.
02100 JRST BOTHOUT
02200
02300 END